package org.ala.tiktools.rpc.kcp.protocol.receiver;

import org.ala.tiktools.rpc.kcp.exception.KcpRpcOutOfMemeryException;

/**
 * 待回复的ack列表
 *
 * @author ala
 * @date 2025-04-13 11:55
 */
public class AckList {

    /**
     *  待回复数量
     *  <p> size << 1 - 2：就是最后一个待回复ack的sn
     *  <p> size << 1 - 1：就是最后一个待回复ack的ts
     */
    protected int size;
    protected int[] datas;
    /**
     *  初始容量
     *  <p> 超过该容量datas翻倍
     */
    protected int capacity;

    public AckList(int capacity) {
        this.capacity = capacity;
        if (capacity << 1 < 0) {
            throw new KcpRpcOutOfMemeryException("待ack列表超过最大长度 2^30");
        }
        datas = new int[capacity << 1];
    }


    /**
     * 追加待回复的sn，ts
     */
    public void add(int sn, int ts) {
        //  翻倍扩容
        if (size+1 > capacity) {
            capacity <<= 1;
            if (capacity << 1 < 0) {
                throw new KcpRpcOutOfMemeryException("待ack列表超过最大长度 2^30");
            }
            int[] newDatas = new int[capacity << 1];
            System.arraycopy(datas, 0, newDatas, 0, datas.length);
            datas = newDatas;
        }

        int p = size << 1;
        datas[p] = sn;
        datas[p+1] = ts;
        size++;
    }


    /**
     *  数量
     */
    public int size() { return size; }
    /**
     *
     */
    public int indexOf(int i) { return datas[i]; }
    /**
     *
     */
    public void clear() {
        size = 0;
    }
}
